package com.dkm.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.dkm.entity.Module;
import com.dkm.entity.Permission;
import com.dkm.entity.Role;
import com.dkm.repository.ModuleRepository;
import com.dkm.repository.PermissionRepository;
import com.dkm.repository.RoleRepository;
import com.dkm.service.RoleService;
import com.dkm.util.ResultUtil;

@Service
public class RoleServiceImpl implements RoleService {

	//注入角色持久层
	@Autowired
	private RoleRepository roleRepository;
	//注入模块持久层
	@Autowired
	private ModuleRepository moduleRepository;
	//注入权限业务层
	@Autowired
	private PermissionRepository permissionRepository;
	//-------------------------首页获取用户功能菜单------------------------
	@Override
	public List<Module> findRolesByRoleIds(List<String> roleIds) {
		//根据角色id获取角色集合
		List<Role> roles=roleRepository.findAllById(roleIds);
		//获取角色集合中的模块集合并去除重复模块
		return this.distinctModule(roles);
	}

	@Override
	public List<Module> distinctModule(List<Role> roles) {
		//创建模块集合
		List<Module> newModules=new ArrayList<Module>();
		//遍历角色集合
		for(Role role:roles) {
			//如果角色的模块集合不为空
			if(role.getModules()!=null) {
				//遍历模块集合
				for(Module module:role.getModules()) {
					//查找当前遍历的模块是否存在于新的模块集合中
					boolean res=this.existsModule(module, newModules);
					//不存在添加到新集合中
					if(!res) {
						newModules.add(module);
					}
				}
			}
		}
		//返回去重后的模块集合
		return newModules;
	}

	@Override
	public boolean existsModule(Module module, List<Module> modules) {
		//遍历集合查找模块
		for(Module item:modules) {
			//如果当前遍历的模块id等于传入的模块的id
			if(item.getModule_id().equals(module.getModule_id())) {
				//存在返回true
				return true;
			}
		}
		//不存在
		return false;
	}
	//-------------------------end---------------------------------

	@Override
	public Page<Role> findAllRoles(Role role, Pageable pageable) {
		
		return roleRepository.findAll(this.get(role), pageable);
	}

	private Specification<Role> get(Role role) {
		return new Specification<Role>() {

			@Override
			public Predicate toPredicate(Root<Role> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
				//1、创建Predicate对象,动态sql表达式
				Predicate predicate=criteriaBuilder.conjunction();
				//2、创建一个集合，存放多个条件,动态sql表达式集合
				List<Expression<Boolean>> expressions=predicate.getExpressions();
				
				return predicate;
			}
		};
	}

	@Transactional //开启事务
	@Override
	public ResultUtil saveAndFlushRole(Role role) {
		ResultUtil resultUtil=null;
		String operation="";
		
		if(role.getRole_id()!=null) {
			operation="修改";
			//查询除了自己的角色信息
			Role existsrole=roleRepository.findByRole_nameAndNotRole_id(role.getRole_id(), role.getRole_name());
			if(existsrole!=null) {
				return new ResultUtil(-1, operation+ "失败,该角色名已存在!", null);
			}
		}else {
			operation="添加";
			//根据角色名查询是否存在该角色
			Role existsrole=roleRepository.findByRole_name(role.getRole_name());
			if(existsrole!=null) {
				return new ResultUtil(-1, operation+ "失败,该角色名已存在!", null);
			}
			//生成uuid作为新增角色的id
			String role_id=UUID.randomUUID().toString();
			role.setRole_id(role_id);
		}
		
		Role r=roleRepository.saveAndFlush(role);
		if(r!=null) {
			resultUtil=new ResultUtil(0, operation+ "成功", r);
		}else {
			resultUtil=new ResultUtil(-1, operation+ "失败", null);
		}
		return resultUtil;
	}
	@Transactional //开启事务
	@Override
	public ResultUtil deleteRole(String role_id) {
		Role role=new Role();
		role.setRole_id(role_id);
		
		try {
			roleRepository.delete(role);
			
			return new ResultUtil(0, "删除成功", null);
		} catch (Exception e) {
			return new ResultUtil(-1, "删除失败", null);
		}
	}
	@Transactional //开启事务
	@Override
	public ResultUtil giveRoleSetPermission(String role_id, List<Integer> moduleids, List<String> permissionids) {
		ResultUtil resultUtil=null;
		//获取角色信息
		Role role=roleRepository.findById(role_id).get();
		if(role==null) {
			return new ResultUtil(-1, "设置失败", null);
		}
		//批量获取模块和权限信息
		List<Module> modules=null;
		if(moduleids!=null) {
			modules=moduleRepository.findAllById(moduleids);
		}
		List<Permission> permissions=null;
		if(permissionids!=null) {
			permissions=permissionRepository.findAllById(permissionids);
		}
		//设置角色的模块和权限
		role.setModules(modules);
		role.setPermissions(permissions);
		//保存角色
		Role r=roleRepository.saveAndFlush(role);
		if(r!=null) {
			resultUtil=new ResultUtil(0, "设置成功", r);
		}else {
			resultUtil=new ResultUtil(-1, "设置失败", null);
		}
		return resultUtil;
	}
}
